package ar.uba.fi.algo3.algoTank.Objetos;

import java.io.Serializable;


import ar.uba.fi.algo3.algoTank.ObservadorJuego;
import ar.uba.fi.algo3.algoTank.Interfaces.ObjetoVivo;
import ar.uba.fi.algo3.algoTank.Objetos.Tanques.AlgoTank;
import ar.uba.fi.algo3.titiritero.Posicionable;

public abstract class Objeto implements ObjetoVivo, Posicionable, Serializable  {

	private static final long serialVersionUID =61L;
	
	protected Ubicacion ubicacion;
	protected transient Territorio territorio;
	protected float deltaTiempo;
	protected boolean vivo;

	
	public Objeto (){
		this.vivo = true;
		this.deltaTiempo = 1;
		this.ubicacion = new Ubicacion();
	}
	
	public Objeto (Posicion posicion, Territorio territorio){
		this.vivo = true;
		this.deltaTiempo = 1;
		this.ubicacion = new Ubicacion();
		ubicacion.setPosicion(posicion);
		this.territorio = territorio;
	}
	
	
	public void setUbicacion(Ubicacion unaUbicacion){
		this.ubicacion = unaUbicacion;
	}
	
	public Ubicacion getUbicacion(){
		return this.ubicacion;
	}
		
	public void setTerritorio(Territorio territorio){
		this.territorio = territorio;
	}
	
	public Territorio getTerritorio(){
		return this.territorio;
	}
	
	public boolean esTraspasable() {
		return false;
	}
	
	
	public boolean esInteractuable() {
		return false;
	}
		
	public boolean estaVivo() {
		return this.vivo;
	}
	
	public void morir(){
		this.vivo = false;
	}
	
	public void vivir(){
		
	}
	
	//metodos default para colisionable
	public boolean interactuableConAlgoTank(){
		return false;
	}
	
	public boolean interactuableConProyectil() {
		return false;
	}
	
	public boolean colisiona(Objeto objeto) {	
		//si son el mismo objeto no colisionan
		if (objeto == this)
			return false;
		//si alguno de los dos esta muerto no colisiona
		if (!objeto.estaVivo() || !this.estaVivo())
			return false;
		
		return ubicacion.comparteUbicacion(objeto.getUbicacion());
	}
		
	public void interactuarConAlgoTank(AlgoTank algotank) {
		//nada por default
	}
	
	public void interactuarConProyectil(Proyectil proyectil) {
		//nada por default
	}

	//INTERFAZ POSICIONABLE
	public int getX() {
		float a = this.getUbicacion().getPosicion().getX();
		a -= (this.getUbicacion().getAncho()/2);
		Math.round(a);
		
		return (int) a;
		
	}
	
	public int getY() {
		float a = this.getUbicacion().getPosicion().getY();
		a -= (this.getUbicacion().getAlto()/2);
		Math.round(a);
		
		return (int) a;
		
	}

	public abstract void avisarNuevoObjeto(ObservadorJuego obs);
	
}
